/***********************************************************************************************//**
*\n  @file       device.cpp
*\n  @brief      设备device基类， 定义设备device公共接口
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. 设备device基类， 定义设备device公共接口
*\n       2. 设备device派生类实现（override）公共接口;
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:         描述:
*\n  V0.01   罗先能        2021.4.11          创建
*\n
***************************************************************************************************/

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include <iostream>
#include "vme.h"
#include "device.hpp"

#undef  DEBUG_LEVEL
#define DEBUG_LEVEL  2   // 定义debug级别 (0 ~ 5)
#include "vdebug.h"

using namespace std;

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/


/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/
TDevice::~TDevice()
{
	// debug_printf("TDevice::~TDevice() \n");
	debug_printf("%s->~TDevice() OK\n",this->mName);
}

TDevice::TDevice()
{
	memset(this->mName, 0, sizeof(this->mName));
	pthread_rwlock_init(&(this->mLock), NULL);
	this->pBus = NULL;
	debug_printf("TDevice::TDevice() OK\n");
}

/*************************************************************************************//**
*\n 函数名称： TDevice.TDevice()
*\n 功能描述：
*\n            device构建函数，
*\n 输入参数：
*\n            const char name[]    : 实例名称
*\n            TBus *bus            ：关联总线
*\n
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n     错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.4.10     创建
*****************************************************************************************/
TDevice::TDevice(const char name[], TBus *bus)
{
	// 1. 保存名称
	memset(mName, 0, sizeof(mName));
	int iSize = sizeof(this->mName) - 1;
	iSize = iSize < strlen(name) ? iSize : strlen(name);
	memcpy(this->mName, name, iSize);

	pthread_rwlock_init(&(this->mLock), NULL);
	this->pBus = bus;   // 保存关联总线

	debug_printf("TDevice::TDevice(%s,%p)", this->mName, bus);
}

// public:
int TDevice::Init()   //override
{
	if(this->pBus != NULL)
	{
		pBus->Init();
	}
	return 0;
}

// public:
int TDevice::Open(void *pHandle)   //override
{
	debug_error("TDevice::Open() \n");
	return -1;
}

// public:
int TDevice::Close(void *pHandle)   //override
{
	debug_error("TDevice::Close() \n");
	return -1;
}

// public:
int TDevice::Ioctl(long cmd, void *pBuf, long *pSize)  //override
{
	if(NULL == this->pBus)
	{
		debug_error("pBus == NULL \n");
		return -1;
	}

	int iRet;
	iRet = pBus->Ioctl(cmd, pBuf);
	return(iRet);
}


// public:
int  TDevice::Unlock()   //override
{
    int  iRet;
    iRet = pthread_rwlock_unlock(&(this->mLock));
    return(iRet);
}

// public:
int  TDevice::Lock()   //override
{
    int  iRet;
    iRet = pthread_rwlock_wrlock(&(this->mLock));
    return(iRet);
}

// public:
int  TDevice::Read(long address, void * pBuf, long  iSizeToRead)   //override
{
	if(NULL == this->pBus)
	{
		debug_error("pBus == NULL \n");
		return -1;
	}

	int iRet;
	iRet = pBus->Read(address, pBuf, iSizeToRead);
	return(iRet);
}

// public:
int  TDevice::Write(long address, void * pBuf, long  iSizeToWrite)   //override
{
	if (NULL == this->pBus)
	{
		debug_error("pBus == NULL \n");
		return -1;
	}

	int iRet;
	// pBus->Lock();
	iRet = pBus->Write(address, pBuf, iSizeToWrite);
	// pBus->Lock();
	return(iRet);
}



